package com.lyl.mysqlmonitor.util;

import java.util.List;

/**
 * SQL格式化工具类
 * 负责SQL的格式化处理和参数替换
 */
public class SqlFormatter {

    /**
     * 创建可用于EXPLAIN的SQL语句
     * 将参数占位符替换为实际值
     * 
     * @param sql 原始SQL
     * @param parameters 参数列表
     * @return 替换参数后的SQL
     */
    public static String createExplainableSql(String sql, List<Object> parameters) {
        if (parameters == null || parameters.isEmpty()) {
            return sql;
        }

        StringBuilder result = new StringBuilder(sql);

        // 倒序替换，避免位置变化
        for (int i = parameters.size() - 1; i >= 0; i--) {
            int pos = findNthOccurrence(result, '?', i);
            if (pos >= 0) {
                Object param = parameters.get(i);
                String replacement = formatParameterValue(param);
                result.replace(pos, pos + 1, replacement);
            }
        }

        return result.toString();
    }

    /**
     * 格式化参数值
     * 
     * @param param 参数值
     * @return 格式化后的字符串
     */
    public static String formatParameterValue(Object param) {
        if (param == null) {
            return "NULL";
        } else if (param instanceof String) {
            return "'" + ((String) param).replace("'", "''") + "'";
        } else if (param instanceof java.util.Date) {
            return "'" + param.toString() + "'";
        } else {
            return param.toString();
        }
    }

    /**
     * 查找第n个问号的位置
     * 
     * @param sb StringBuilder
     * @param ch 目标字符
     * @param n 第几个(从0开始)
     * @return 位置索引，不存在返回-1
     */
    private static int findNthOccurrence(StringBuilder sb, char ch, int n) {
        int count = 0;
        for (int i = 0; i < sb.length(); i++) {
            if (sb.charAt(i) == ch) {
                if (count == n) {
                    return i;
                }
                count++;
            }
        }
        return -1;
    }
    
    /**
     * 获取适当的EXPLAIN语句
     * 
     * @param sql 原始SQL
     * @param useJson 是否使用JSON格式输出
     * @return EXPLAIN语句
     */
    public static String getExplainSql(String sql, boolean useJson) {
        if (useJson) {
            return "EXPLAIN FORMAT=JSON " + sql;
        } else {
            return "EXPLAIN " + sql;
        }
    }
    
    /**
     * 私有构造函数，防止实例化
     */
    private SqlFormatter() {
        // 工具类不应被实例化
    }
} 